#include <pthread.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

#include <cstdlib>
#include <iostream>
#include <string>
#include <thread>
using namespace std;

#include <pthread.h>
#include <signal.h>
#include <unistd.h>

#include <iostream>

using namespace std;

void signal_handler(int sig) {
  cout << "Thread " << pthread_self() << " received signal " << sig << endl;
  if (sig == SIGTERM) {
    pthread_exit(nullptr);
  }
}

void *thread_run(void *args) {
  // signal(SIGTERM, signal_handler);
  while (1) {
    cout << "I am new thread" << endl;
    sleep(1);
  }
  return nullptr;
}

int main() {
  pthread_t tid;
  
  pthread_create(&tid, nullptr, thread_run, nullptr);
  int cnt = 5;
  while (cnt--) {
    cout << "I am main thread" << endl;
    sleep(1);
  }
  pthread_kill(tid, SIGINT);
  while (1) {
    cout << "I am main thread" << endl;
    sleep(1);
  }
  return 0;
}

// void signal_handler(int sig) {
//   cout << "Thread " << pthread_self() << " received signal " << sig << endl;
//   if (sig == SIGKILL) {
//     pthread_exit(nullptr);
//   }
// }

// void *thread_run(void *args) {
//   signal(SIGKILL, signal_handler);
//   while (1) {
//     cout << "I am new thread" << endl;
//     sleep(1);
//   }
//   return nullptr;
// }

// int main() {
//   pthread_t tid;
//   pthread_create(&tid, nullptr, thread_run, nullptr);
//   int cnt = 5;
//   while (cnt--) {
//     cout << "I am main thread" << endl;
//     sleep(1);
//   }
//   pthread_kill(tid, SIGKILL);
//   while (1) {
//     cout << "I am main thread" << endl;
//     sleep(1);
//   }
//   return 0;
// }

// void *thread_run(void *args) {
//   while (1) {
//     cout << "I am new thread" << endl;
//     sleep(1);
//   }
//   return nullptr;
// }
// int main() {
//   pthread_t tid;
//   pthread_create(&tid, nullptr, thread_run, nullptr);
//   int cnt = 5;
//   while (cnt--) {
//     cout << "I am main thread" << endl;
//     sleep(1);
//   }
//   pthread_kill(tid, SIGKILL);
//   while (1) {
//     cout << "I am main thread" << endl;
//     sleep(1);
//   }
//   return 0;
// }

// void thread_cpp() {
//   while (true) {
//     cout << " I am a new thread from cpp" << endl;
//     sleep(1);
//   }
// }

// int main() {
//   thread t(thread_cpp);
//   t.join();  // 用于等待线程 对线程进行清理工作
//   return 0;
// }

// class Request {
//  public:
//   Request(int start, int end, const string &threadname)
//       : start_(start), end_(end), threadname_(threadname) {}

//  public:
//   int start_;
//   int end_;
//   string threadname_;
// };

// class Response {
//  public:
//   Response(int result, int exitcode) : result_(result), exitcode_(exitcode)
//   {}

//  public:
//   int result_;
//   int exitcode_;
// };

// void *sumCount(void *args) {
//   Request *rq = static_cast<Request *>(args);
//   Response *ret = new Response(0, 0);
//   for (int i = rq->start_; i <= rq->end_; ++i) {
//     ret->result_ += i;
//   }
//   return ret;
// }

// int main() {
//   pthread_t tid;
//   Request *rq = new Request(1, 100, "Thread1");
//   pthread_create(&tid, nullptr, sumCount, rq);

//   Response *rsp;
//   pthread_join(tid, (void **)&rsp);

//   printf("the sumSount sucess , the result is %d , the exitcode is %d\n",
//          rsp->result_, rsp->exitcode_);
//   delete rsp;
//   delete rq;
//   return 0;
// }

// void* Print(void* arg) {
//   cout << "I am " << (const char*)arg << " , the PID : " << getpid() << endl;

//   int* n = new int;
//   *n = 42;
//   cout << "new thread quit..." << endl;
//   sleep(1);
//   return n;
// }

// int main() {
//   pthread_t newthread;
//   pthread_create(&newthread, nullptr, Print, (void*)"new_thread1");
//   sleep(1);  // 确保线程已经被运行

//   cout << "I am main thread , the PID : " << getpid() << endl;
//   unsigned long int* ret;
//   pthread_join(newthread, (void**)&ret);
//   sleep(2);

//   printf("new thread quit... , the exit_code:%lu\n", *ret);
//   delete ret;

//   return 0;
// }

// void* Print(void* arg) {
//   while (true) {
//     cout << "I am "<<(const char*)arg<<" , the PID : " << getpid() << endl;
//     sleep(2);
//   }
//   int *n;
//   *n = 42;
//   return &n;
// }

// int main() {
//   pthread_t newthread;
//   pthread_create(&newthread, nullptr, Print, (void*)"new_thread1");
//   sleep(1); // 确保线程已经被运行

//   while (true) {
//     cout << "I am main thread , the PID : " << getpid() << endl;
//     sleep(1);
//   }
//   return 0;
// }

// void* Print(void* n) {
//   printf("I am newthread , the tid:%p\n",pthread_self());
//   sleep(1);
//   return nullptr;
// }

// int main() {
//   pthread_t newthread;
//   pthread_create(&newthread, nullptr, Print, nullptr);
//   sleep(1);  // 确保线程已经被运行
//   printf("the new thread tid : %p\n", newthread);
//   sleep(3);
//   return 0;
// }

// void* Print(void* arg) {
//   int cnt = 2;
//   while (cnt--) {
//     cout << "I am "<<(const char*)arg<<" , the PID : " << getpid() << endl;
//     sleep(1);
//   }
//   return nullptr;
// }

// int main() {
//   pthread_t newthread;
//   pthread_create(&newthread, nullptr, Print, (void*)"new_thread1");
//   sleep(1); // 确保线程已经被运行

//   printf("the new thread tid : %p\n",newthread);

//   int cnt = 3;
//   while (cnt--) {
//     cout << "I am main thread , the PID : " << getpid() << endl;
//     sleep(1);
//   }
//   return 0;
// }

// int main()
// {
//   printf("sizeof(void) = %d\n", sizeof(void));
//   printf("sizeof(void*) = %d\n", sizeof(void*));

//   return 0;
// }